﻿using System.Collections.Generic;
using System.Linq;
using Insesoft.Entities;
using NHibernate;
using NHibernate.Linq;

namespace InseSoft.UIControllers
{
    public class CotizacionController : Controller
    {
        #region Constructors

        public CotizacionController(){ }

        public CotizacionController(ISession session) : base(session) {}

        #endregion

        #region Declarations

        private static Precio precio;

        #endregion

        #region Properties: Public

        public Precio Precio
        {
            get { return precio ?? (precio = GetById<Precio>(ApplicationSession.Instance.Empresa.Id)); }
        }

        #endregion

        #region Methods: Public

        public Cotizacion Save(Cotizacion cotizacion)
        {
            var result = Save<Cotizacion>(cotizacion);
            if (!string.IsNullOrEmpty(result.NumPedido))
            {
                var orden = new Orden
                {
                    Cotizacion = cotizacion,
                    Empresa = ApplicationSession.Instance.Empresa,
                    FecInicio = CurrentDateProvider(),
                    NumPedido = result.NumPedido
                };
                Save(orden);
            }
            return result;
        }
       
        public IList<Cotizacion> Search(SearchCriteria criteria)
        {
            var query = Session.Query<Cotizacion>()
                .Where(c => c.Empresa == ApplicationSession.Instance.Empresa);
            if (criteria.Cliente != null) query = query.Where(c => c.Cliente == criteria.Cliente);
            if (criteria.Vendedor != null) query = query.Where(c => c.Vendedor == criteria.Vendedor);
            if (criteria.Material != null) query = query.Where(c => c.Material == criteria.Material);
            if (criteria.Linea != null) query = query.Where(c => c.Linea == criteria.Linea);
            if (criteria.FechaInicial != null) query = query.Where(c => c.Fecha >= criteria.FechaInicial && c.Fecha <= criteria.FechaFinal);
            
            return query.ToList();
        }

        public static SolicitudCotizacionReport ConvertEntityToReport(SolicitudCotizacion solicitud)
        {
            var report = new SolicitudCotizacionReport
            {
                Aplicada = solicitud.Aplicada,
                Cantidades = solicitud.Cantidades.Replace(",", " / "),
                CotizacionId = solicitud.CotizacionId,
                Cuatricromia = solicitud.Cuatricromia,
                Cubrimiento = solicitud.Cubrimiento,
                EmpId = (short)solicitud.Empresa.Id,
                Fecha = solicitud.Fecha.HasValue ? solicitud.Fecha.Value.ToString("dd/MM/yyyy") : "",
                Id = solicitud.Id,
                LineaNombre = solicitud.Linea != null ? solicitud.Linea.Nombre : "",
                MaterialAltura = solicitud.MaterialAltura,
                MaterialBase = solicitud.MaterialBase,
                MaterialFondo = solicitud.MaterialFondo,
                MaterialNombre = solicitud.Material != null ? solicitud.Material.Nombre : "",
                Montaje = solicitud.Montaje,
                Observaciones = solicitud.Observaciones,
                Producto = solicitud.Producto,
                ProductoAltura = solicitud.ProductoAltura,
                ProductoBase = solicitud.ProductoBase,
                ProductoFondo = solicitud.ProductoFondo,
                Rendimiento = solicitud.Rendimiento,
                Tintas1Cara = solicitud.Tintas1Cara,
                Tintas2Cara = solicitud.Tintas2Cara,
                TipoProductoNombre = solicitud.TipoProducto != null ? solicitud.TipoProducto.Nombre : "",
                Troquel = solicitud.Troquel,
                VendedorNombre = solicitud.Vendedor != null ? solicitud.Vendedor.Nombre : ""
            };
            if (solicitud.Cliente != null)
            {
                report.ClienteContacto = solicitud.Cliente.ContactoNombre;
                report.ClienteCorreo = solicitud.Cliente.ContactoCorreo;
                report.ClienteNombre = solicitud.Cliente.Nombre;
                report.ClienteTelefono = solicitud.Cliente.Telefono;
            }
            return report;
        }

        #endregion
    }
}